package algo.A01_位运算;

/**
 * 位运算的奇巧淫技
 */
public class M01_BitOperator {
    public static void main(String[] args) {
        /**
         * 1.判断奇偶数
         *
         * 通过最低二进制位是否为0判断奇偶，0偶1奇
         * 方法：将十进制数与1做"与运算"，得出的结果为0时是偶数，否则是奇数
         * 例如：
         * 十进制数10(二进制1010)，与1(二进制0001)做与运算，结果为0，说明是偶数
         * 1 0 1 0
         * &
         * 0 0 0 1
         * -------
         * 0 0 0 0
         */
        int num = 99;
        System.out.println(num + "是" + ((num & 1) == 0 ? "偶数" : "奇数"));

        /**
         * 2.获取二进制位是0还是1
         *
         * 方法：例如获取int类型的num第5个二进制位的值，则先将num右移四位，
         * 然后与1做与运算，得出的结果是0则num第5个二进制位是0，否则是1
         */
        num = 86;//0101 0110
        System.out.println(num + "的第7个二进制位的值是" + ((((1 << 6) & num) >> 6 == 0) ? 0 : 1));
        System.out.println(num + "的第7个二进制位的值是" + ((((num >> 6) & 1) == 0) ? 0 : 1));

        /**
         * 3.不用判断语句，通过位运算求整数的绝对值
         * (num ^ (num >> 31)) + (num >>> 31)
         * 注意第一个与运算要加括号，因为加号的优先级更高，如果不加括号会先算加法
         */
        num = -20;
        int numAbs = (num ^ (num >> 31)) + (num >>> 31);
        System.out.println(num + "的绝对值是" + numAbs);
    }
}
